home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / math.swg / 0124_Fixed point conversions.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-05-30  |  4.0 KB  |  128 lines

  1. Type Fijo=Record                {estructura de un n▀ de coma fija}
  2.             Mantisa,
  3.             Decimal:Integer
  4.           End;
  5.  
  6. Var Var1,                       {variables de ejemplo}
  7.     Var2:Fijo;
  8.  
  9. Const Decimal_Max=100;            {2 decimales}
  10.       Decimal_Stellen=2;
  11.  
  12. Function Strg(NumF:Fijo):String;
  13. {convierte un n▀ de coma fija en una cadena}
  14. Var Decimal_Str,                  {cadena para formar los decimales}
  15.     Mantisa_Str:String;            {cadena para formar la mantisa}
  16.     i:Word;
  17. Begin
  18.   If NumF.Decimal < 0 Then       {parte decimal sin signo}
  19.     NumF.Decimal:=-NumF.Decimal;
  20.   Str(NumF.Decimal:Decimal_Stellen,Decimal_Str);
  21.                                 {generar cadena decimal}
  22.   For i:=0 to Decimal_Stellen do  {y sustituir blancos por 0en}
  23.     If Decimal_Str[i] = ' ' Then Decimal_Str[i]:='0';
  24.   Str(NumF.Mantisa,Mantisa_Str);     {generar cadena de mantisa}
  25.   Strg:=Mantisa_Str+','+Decimal_Str; {componer cadena}
  26. End;
  27.  
  28. Procedure Convert(RZahl:Real;Var NumF:Fijo);
  29. {convierta real RZahl en n▀ coma fija NumF}
  30. Begin
  31.   NumF.Mantisa:=Trunc(RZahl);
  32.     {determinar parte mantisa}
  33.   NumF.Decimal:=Trunc(Round(Frac(RZahl)*Decimal_Max));
  34.     {determinar parte decimal y guardar como n▀ entero}
  35. End;
  36.  
  37. Procedure Adjust(Var NumF:Fijo);
  38. {devuelve el número de coma fija en formato legal}
  39. Begin
  40.   If NumF.Decimal > Decimal_Max Then Begin
  41.     Dec(NumF.Decimal,Decimal_Max); {si parte decimal ha rebasado positivo}
  42.     Inc(NumF.Mantisa);            {reponer y reducir mantisa}
  43.   End;
  44.   If NumF.Decimal < -Decimal_Max Then Begin
  45.     Inc(NumF.Decimal,Decimal_Max); {si parte decimal ha rebasado negativo}
  46.     Dec(NumF.Mantisa);            {reponer y aumentar mantisa}
  47.   End;
  48. End;
  49.  
  50. Procedure Add(Var Summe:Fijo;NumF1,NumF2:Fijo);
  51. {Suma NumF1 y NumF2 y deposita resultado en ab}
  52. Var Resultado:Fijo;
  53. Begin
  54.   Resultado.Decimal:=NumF1.Decimal+NumF2.Decimal;
  55.     {sumar parte decimal}
  56.   Resultado.Mantisa:=NumF1.Mantisa+NumF2.Mantisa;
  57.     {sumar mantisa}
  58.   Adjust(Resultado);
  59.     {pasar resultado a formato correcto}
  60.   Summe:=Resultado;
  61. End;
  62.  
  63. Procedure Sub(Var Diferencia:Fijo;NumF1,NumF2:Fijo);
  64. {resta NumF1 de NumF2 y deposita resultado en ab}
  65. Var Resultado:Fijo;
  66. Begin
  67.   Resultado.Decimal:=NumF1.Decimal-NumF2.Decimal;
  68.     {restar parte decimal}
  69.   Resultado.Mantisa:=NumF1.Mantisa-NumF2.Mantisa;
  70.     {restar mantisa}
  71.   Adjust(Resultado);
  72.     {pasar resultado a formato correcto}
  73.   Diferencia:=Resultado;
  74. End;
  75.  
  76. Procedure Mul(Var Producto:Fijo;NumF1,NumF2:Fijo);
  77. {multiplica NumF1 y NumF y deposita el resultado en ab}
  78. Var Resultado:LongInt;
  79. Begin
  80.   Resultado:=Var1.Mantisa*Decimal_Max + Var1.Decimal;
  81.     {formar primer factor}
  82.   Resultado:=Resultado * (Var2.Mantisa*Decimal_Max + Var2.Decimal);
  83.     {formar segundo factor}
  84.   Resultado:=Resultado div Decimal_Max;
  85.     {compensar factor aux. Decimal_Max}
  86.   Producto.Mantisa:=Resultado div Decimal_Max;
  87.     {extraer mantisa y parte decimal}
  88.   Producto.Decimal:=Resultado mod Decimal_Max;
  89. End;
  90.  
  91. Procedure Divi(Var Cociente:Fijo;NumF1,NumF2:Fijo);
  92. {divide NumF1 entre NumF2 y deposita el resultado en ab}
  93. Var Resultado:LongInt;           {resultado intermedio}
  94. Begin
  95.   Resultado:=NumF1.Mantisa*Decimal_Max + NumF1.Decimal;
  96.     {formar contador}
  97.   Resultado:=Resultado * Decimal_Max div
  98. (NumF2.Mantisa*Decimal_Max+NumF2.Decimal);
  99.     {dividir por el divisor, antes disponer de m▌s decimales}
  100.   Cociente.Mantisa:=Resultado div Decimal_Max;
  101.     {extraer parte decimal y mantisa}
  102.   Cociente.Decimal:=Resultado mod Decimal_Max;
  103. End;
  104.  
  105. Begin
  106.   WriteLn;
  107.   Convert(-10.2,Var1);          {cargar dos números de demo}
  108.   Convert(25.3,Var2);
  109.  
  110.   {c▌lculos propios para demostración:}
  111.  
  112.   Write(Strg(Var1),'*',Strg(Var2),'= ');
  113.   Mul(Var1,Var1,Var2);
  114.   WriteLn(Strg(Var1));
  115.  
  116.   Write(Strg(Var1),'-',Strg(Var2),'= ');
  117.   Sub(Var1,Var1,Var2);
  118.   WriteLn(Strg(Var1));
  119.  
  120.   Write(Strg(Var1),'/',Strg(Var2),'= ');
  121.   Divi(Var1,Var1,Var2);
  122.   WriteLn(Strg(Var1));
  123.  
  124.   Write(Strg(Var1),'+',Strg(Var2),'= ');
  125.   Add(Var1,Var1,Var2);
  126.   WriteLn(Strg(Var1));
  127. End.
  128.